package main

import "fmt"

/*
  观察者模式
  使得一种类型的实例可以发送事件给其他类型，前提是接收事件的实例要根发送者订阅这个事件。
*/

//事件
type Event struct {
	Data string
}
//观察者就是事件接受者
type Observer interface {
	OnNotify(event Event)
}
//通知者
type Notifier interface {
	Register(observer Observer)
	Degister(observer Observer)
	Notify(event Event)
}

type EventCenter struct {
	obs []Observer
}

//注册观察者
func (e *EventCenter) Register(observer Observer)  {
	e.obs =append(e.obs,observer)
}
//取消观察者
func (e *EventCenter) Degister(observer Observer)  {
	var index int
	for i, v := range e.obs {
		if observer == v {
			index = i
			break
		}
	}
	e.obs = append(e.obs[:index], e.obs[index+1:]...)
}
//通知事件
func (e *EventCenter) Notify(event Event)  {
	for _,v := range e.obs  {
		v.OnNotify(event)
	}
}

func NewEventCenter() *EventCenter {
	obs := make([]Observer,0)
	return &EventCenter{obs:obs}
}

//事件接受者
type EventReciver struct {

}

func (e EventReciver) OnNotify(event Event)  {
    fmt.Println(event.Data)
}

func main() {

	eventCenter := NewEventCenter()
	//创建2个观察者
	er1 := EventReciver{}
	er2 := EventReciver{}
	//注册2个
	eventCenter.Register(er1)
	eventCenter.Register(er2)
	//触发事件1
	eventCenter.Notify(Event{"event 1"})
	//取消注册人1
	eventCenter.Degister(er1)
	//触发事件2
	eventCenter.Notify(Event{"event 2"})
}
